#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn = 1005;
int n, m;
int a[maxn], b[maxn];
int dp[maxn][maxn];

void solve(){
	cin >> n >> m;
	for (int i=1;i<=n;i++) {
		cin >> a[i];
	}
	
	for (int i=1;i<=m;i++) {
		cin >> b[i];
	}
	
	int ans = 0;
	for (int i=1;i<=n;i++) {
		for (int j=1;j<=m;j++) {
			if (a[i] == b[j]) {
				dp[i][j] = dp[i-1][j-1] + 1; // 只有相等才可能变长, 其他都是直接转移过来的
			}
			dp[i][j] = max(dp[i][j], max(dp[i][j-1], dp[j-1][i]));
		}
	}
	cout << dp[n][m] << '\n';
	
	// 同时, 将其中一种最长的序列打印出来
	// 从 (n, m) 反着走过来
	int x=n, y=m;
	vector<int> v;
	while(x && y){
		if (a[x] == b[y]) { // 两个值相等, 说明属于最长序列的, 因为只有相等才可能变长
			v.push_back(a[x]);
			x--;
			y--;
		} else if (dp[x][y-1] > dp[x-1][y]) { // 注意这里面使用的是 dp 数组进行判断
			// 往大的地方走, 因为不相等时, 是从较大值的地方转移过来的
			y--;
		} else {
			x--;
		}
	}
	
	// 最后得到的是 反过来的结果
	reverse(v.begin(), v.end());
	for (const auto i : v) {
		cout << i << ' ';
	}
	cout << '\n';
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
